     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.plan.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.plan.dto.PerTrabConDto;
import com.brain.plan.dto.PeriodoDto;
import com.brain.plan.manager.PeriodoManager;
import com.brain.plan.view.util.ConstantesPlan;
import com.brain.sgc.dto.PersonaDto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("periodoMBean")
@Scope("session")
public class PeriodoMBean extends GenericMBean implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(PeriodoMBean.class);
    
    /**
     * manager: comunica a la vista con la capa de negocio de la entidad PeriodoDto
     * @since 10/01/2014
     */
    @Resource
    private PeriodoManager manager;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * sessionMBean: contiene información del usuario, asi como las acciones que se realizan sobre la entidad
     * @since 10/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * bitacoraManager: permite desplegar un popup con las acciones que se realizaron sobre la entidad
     * @since 10/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private ArchivoMBean archivoMBean;
    
    /**
     * lista: almacena el listado de registros de la entidad PeriodoDto. Usada en la vista listaPeriodo.xhtml
     * @since 10/01/2014
     */
    private List<PeriodoDto> lista;
    
    /**
     * listaEstados: variable que almacena un combo de estados
     * @since 10/01/2014
     */
    private SelectItem[] listaEstados;
    
    /**
     * siMesesTodos: variable que almacena un combo de meses
     * @since 10/01/2014
     */
    private SelectItem[] siMesesTodos;
    
    /**
     * dto: almacena los datos provenientes de la vista periodo.xhtml
     * @since 10/01/2014
     */
    private PeriodoDto dto;
    
    /**
     * dtoFiltro: almacena los datos provenientes de la vista listaPeriodo.xhtml
     * @since 10/01/2014
     */
    private PeriodoDto dtoFiltro;
    
    /**
     * mensajeError: variable que almacena un mensaje de error
     * @since 10/01/2014
     */
    private String mensajeError;
    
    /**
     * siMeses: variable que almacena un combo de meses
     * @since 10/01/2014
     */
    private SelectItem[] siMeses;
    
    /**
     * listaPerTrab: variable utilizada para generar un combo de la entidad PerTrabConDto
     * @since 10/01/2014
     */
    private List<PerTrabConDto> listaPerTrab;
    
    /**
     * listaEmpleados: variable que almacena un combo de empleados
     * @since 10/01/2014
     */
    private List<PersonaDto> listaEmpleados;
    
    /**
     * dtoDeta: variable que almacena los datos de un empleado
     * @since 10/01/2014
     */
    private PersonaDto dtoDeta;
    
    /**
     * accesoBtnGuardar: variable que gestiona el acceso al botón guardar
     * @since 10/01/2014
     */
    private boolean accesoBtnGuardar;
    
    /**
     * accesoBtnCerrar: variable que gestiona el acceso al botón cerrar
     * @since 10/01/2014
     */
    private boolean accesoBtnCerrar;
    
    /**
     * montoPorDia: variable que almacena el monto cobrado por día
     * @since 10/01/2014
     */
    private BigDecimal montoPorDia;
    
    /**
     * montoPorHora: variable que almacena el monto cobrado por hora
     * @since 10/01/2014
     */
    private BigDecimal montoPorHora;
    
    /**
     * montoPorMinuto: variable que almacena el monto cobrado por minuto
     * @since 10/01/2014
     */
    private BigDecimal montoPorMinuto;
    
    /**
     * keyTitulo: variable que almacena el titulo de los paneles de la entidad
     * @since 10/01/2014
     */
    private String keyTitulo = "form.periodo.panel";

    /**
     * iniciar(): inicializa las variable dtoFiltro y lista
     * @return retorna la dirección de la vista listaPeriodo.xhtml
     */
    public String iniciar() {
        this.dtoFiltro = new PeriodoDto();
        this.dtoFiltro.setEstado(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_TODOS);
        this.lista = null;
        return this.manager.getUrlLista();
    }

    /**
     * buscar(ae): realiza la búsqueda de registros de la entidad PeriodoDto y lo asigna a la variable lista
     * @since: 10/01/2014
     * @param ae por defecto null
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerPeriodos(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    /**
     * nuevo(): setea la accion a nuevo, crea el titulo del panel entidad e inicializa las entidades
     * @since 10/01/2014
     * @return retorna la dirección de la vista periodo.xhtml
     */
    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = this.manager.inicializar();
        gestionAcceso();
        return this.manager.getUrl();
    }

    /**
     * editar(): setea la accion a editar, crea el titulo del panel de la entidad e inicializa las entidades detalle
     * @since 10/01/2014
     * @return retorna la direccion de la vista periodo.xhtml
     */
    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.listaEmpleados = manager.obtenerEmpleadosPorPeriodo();
        gestionAcceso();
        return manager.getUrl();
    }

    /**
     * editarAjax(): setea la accion a editar, crea el titulo del panel de la entidad
     * @since 10/01/2014
     * @return retorna la direccion de la vista periodo.xhtml
     */
    public String editarAjax() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        gestionAcceso();
        return manager.getUrl() + "?faces-redirect=true";
    }

    /**
     * ver(): setea la accion a ver, crea el titulo del panel de la entidad e inicializa las entidades detalle
     * @since 10/01/2014
     * @return retorna la dirección de la vista periodo.xhtml
     */
    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.listaEmpleados = manager.obtenerEmpleadosPorPeriodo();
        gestionAcceso();
        return this.manager.getUrl();
    }

    /**
     * verConceptos(): método encargado de mostrar los conceptos por empleado y periodo
     * @since 10/01/2014
     */
    public void verConceptos() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.listaPerTrab = manager.obtenerConceptosPorEmpYPer(this.dtoDeta.getId(), this.dto.getId());
        calculoMontosPorDia();
    }

    /**
     * gestionAcceso(): método que gestiona el acceso a los botones
     * @since 10/01/2014
     */
    public void gestionAcceso() {
        accesoBtnGuardar = true;
        accesoBtnCerrar = true;
        if (this.dto.getId() != null) {
            accesoBtnGuardar = false;
            accesoBtnCerrar = true;
            if (dto.getEstado().equals(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_CERRADO)) {
                accesoBtnCerrar = false;
            }
        } else {
            accesoBtnCerrar = false;
        }

        //Si la accion es = VER
        if (sessionMBean.getAccion() == applicationMBean.getVer()) {
            accesoBtnGuardar = false;
            accesoBtnCerrar = false;
        }
    }

    /**
     * guardar(): método encargado de guardar la entidad PeriodoDto
     * @since 10/01/2014
     * @return retorna la dirección de la página a la cual va a redireccionar
     */
    public String guardar() {
        if (manager.guardar(dto) != null) {
            this.listaEmpleados = manager.obtenerEmpleadosPorPeriodo();
            sessionMBean.setAccion(applicationMBean.getEditar());
            sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
            gestionAcceso();
            //return this.editarAjax();
        }
        return "";
    }

    /**
     * autoCompletarPeriodosAbiertos(): obtiene un listado de todos los periodos
     * @since 10/01/2014
     * @param query
     * @return retorna un listado de la entidad PeriodoDto para mostrarlo en el control autocomplete
     */
    public List<PeriodoDto> autoCompletarPeriodosAbiertos(String query) {
        List<PeriodoDto> results = null;
        try {
            results = manager.obtenerPeriodosActivos(query);
        } catch (DAOException ex) {
            logger.error(ex);
            results = new ArrayList<PeriodoDto>();
        }
        return results;
    }

    /**
     * changeMesPeriodo(): al realizar el cambio de un mes se setea una nueva fecha
     * @since 10/01/2014
     */
    public void changeMesPeriodo() {
        System.out.println(dto.getMes());
        Calendar c = Calendar.getInstance();
        System.out.println(c.get(Calendar.MONTH));
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMinimum(Calendar.DAY_OF_MONTH));
        dto.setInicioPeriodo(c.getTime());
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMaximum(Calendar.DAY_OF_MONTH));
        dto.setFinPeriodo(c.getTime());
    }

    /**
     * cargarPopupConceptos(): método encargado de cargar un popup de conceptos
     * @since 10/01/2014
     */
    public void cargarPopupConceptos() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.listaPerTrab = manager.obtenerConceptosPorEmpYPerListado(this.dtoDeta.getId(), this.dto.getId());
        calculoMontosPorDia();
    }

    /**
     * calculoMontosPorDia(): calcula los montos por día
     * @since 10/01/2014
     */
    public void calculoMontosPorDia(){
        this.montoPorDia = manager.obtenerMontoPorDiaLaborado(dto.getId(),dtoDeta.getId() , dtoDeta.getContVigenteDto().getRemBasica());
        System.out.println("MONTO POR DIA -> " + this.montoPorDia);
        this.montoPorHora = manager.obtenerMontoPorHoraLaborada(dto.getId(),dtoDeta.getId() , dtoDeta.getContVigenteDto().getRemBasica());
        this.montoPorMinuto = manager.obtenerMontoPorMinutoLaborado(dto.getId(),dtoDeta.getId() , dtoDeta.getContVigenteDto().getRemBasica());
    }
    
    /**
     * guardarValoresConcepto(): guarda los conceptos
     * @since 10/01/2014
     */
    public void guardarValoresConcepto() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        manager.guardarValores(listaPerTrab);
        cargarPopupConceptos();
        context.addCallbackParam("CallbackParam", resultado);
    }

    /**
     * cerrar(): método encargado de cerrar un periodo
     * @since 10/01/2014
     */
    public void cerrar() {
        manager.cerrarPeriodo(dto);
        gestionAcceso();
    }

    /**
     * verBitacora(): método encargado de mostrar un popup con las acciones realizadas sobre la entidad
     * @since 10/01/2014
     * @return retorna null
     */
    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    /**
     * retroceder(): retorna a la pagina listaPeriodo.xhtml mostrando el listado de todos los registros
     * @since 10/01/2014
     * @return retorna la dirección de la vista listaPeriodo.xhtml
     */
    public String retroceder() {
        buscar(null);
        return this.manager.getUrlLista();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public PeriodoDto getDto() {
        return dto;
    }

    public void setDto(PeriodoDto dto) {
        this.dto = dto;
    }

    public PeriodoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(PeriodoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<PeriodoDto> getLista() {
        return lista;
    }

    public void setLista(List<PeriodoDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PeriodoMBean.logger = logger;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public PeriodoManager getManager() {
        return manager;
    }

    public void setManager(PeriodoManager manager) {
        this.manager = manager;
    }

    public SelectItem[] getListaEstados() {
        return this.manager.obtenerListaEstados();
    }

    public void setListaEstados(SelectItem[] listaEstados) {
        this.listaEstados = listaEstados;
    }

    public SelectItem[] getSiMesesTodos() {
        return manager.siListaMesesTodos();
    }

    public void setSiMesesTodos(SelectItem[] siMesesTodos) {
        this.siMesesTodos = siMesesTodos;
    }

    public SelectItem[] getSiMeses() {
        return manager.siListaMeses();
    }

    public void setSiMeses(SelectItem[] siMeses) {
        this.siMeses = siMeses;
    }

    public List<PerTrabConDto> getListaPerTrab() {
        return listaPerTrab;
    }

    public void setListaPerTrab(List<PerTrabConDto> listaPerTrab) {
        this.listaPerTrab = listaPerTrab;
    }

    public boolean getAccesoBtnGuardar() {
        return accesoBtnGuardar;
    }

    public void setAccesoBtnGuardar(boolean accesoBtnGuardar) {
        this.accesoBtnGuardar = accesoBtnGuardar;
    }

    public PersonaDto getDtoDeta() {
        return dtoDeta;
    }

    public void setDtoDeta(PersonaDto dtoDeta) {
        this.dtoDeta = dtoDeta;
    }

    public List<PersonaDto> getListaEmpleados() {
        return listaEmpleados;
    }

    public void setListaEmpleados(List<PersonaDto> listaEmpleados) {
        this.listaEmpleados = listaEmpleados;
    }

    public boolean isAccesoBtnCerrar() {
        return accesoBtnCerrar;
    }

    public void setAccesoBtnCerrar(boolean accesoBtnCerrar) {
        this.accesoBtnCerrar = accesoBtnCerrar;
    }

    public BigDecimal getMontoPorDia() {
        return montoPorDia;
    }

    public void setMontoPorDia(BigDecimal montoPorDia) {
        this.montoPorDia = montoPorDia;
    }

    public BigDecimal getMontoPorHora() {
        return montoPorHora;
    }

    public void setMontoPorHora(BigDecimal montoPorHora) {
        this.montoPorHora = montoPorHora;
    }

    public BigDecimal getMontoPorMinuto() {
        return montoPorMinuto;
    }

    public void setMontoPorMinuto(BigDecimal montoPorMinuto) {
        this.montoPorMinuto = montoPorMinuto;
    }
    
}
